package uy.org.softtech.cssuite.core;

import static org.springframework.util.Assert.notNull;

import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.context.MessageSource;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.servlet.ModelAndView;

/**
 * Clase abstracta que contiene las funcionalidades comunes a todos los controladores.
 * 
 * @author fabian.lobo
 */
public abstract class Controlador {
	
	/**
	 * Enumerado que representa las diferentes acciones que un controlador puede recibir.
	 * 
	 * @author fabian.lobo
	 */
	public enum Accion {
		LISTAR, VER, CREAR, ACTUALIZAR, ACTIVAR, DESACTIVAR, BLOQUEAR, DESBLOQUEAR, ELIMINAR, CERRAR, EJECUTAR, REPORTAR, CREDENCIALES, PERFIL, CANCELAR
	}
	
	/**
	 * Enumerado que representa los diferentes módulos de la aplicación.
	 * 
	 * @author fabian.lobo
	 */
	public enum Modulo {
		SESIONES, TAREAS, USUARIOS, CLIENTES
	}
	
	/**
	 * Enumerado que representa los diferentes reportes que se pueden brindar.
	 * 
	 * @author fabian.lobo
	 */
	public enum Reporte {
		XLS, PDF
	}
	
	/**
	 * Enumerado que representa los diferentes tipos de mensajes que se pueden brindar.
	 * 
	 * @author fabian.lobo
	 */
	private enum Mensaje {
		INFORMACION, ERROR
	}
	
	@Resource(name = "fuente-mensajes")
	private MessageSource fuenteMensajes;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		notNull(fuenteMensajes(), "La propiedad [fuenteMensajes] de [" + getClass().getName() + "] no ha sido establecida.");
	}
	
	protected void registrarError(BindingResult errores, String mensaje) {
		errores.addError(new ObjectError("", mensaje));
	}

	protected void registrarErrorGeneral(BindingResult errores, Locale locale) {
		errores.addError(new ObjectError("", fuenteMensajes().getMessage("mensaje.errorGeneral", null, "Ha ocurrido un error no esperado. Por favor, contacte al administrador del sistema.", locale)));
	}
	
	protected void mostrarMensajeInformacion(ModelAndView respuesta, String mensaje, boolean redirige, String redireccion) {
		mostrarMensaje(Mensaje.INFORMACION, respuesta, mensaje, redirige, redireccion);
	}
	
	protected void mostrarMensajeError(ModelAndView respuesta, String mensaje, boolean redirige, String redireccion) {
		mostrarMensaje(Mensaje.ERROR, respuesta, mensaje, redirige, redireccion);
	}
	
	private void mostrarMensaje(Mensaje tipoMensaje, ModelAndView respuesta, String mensaje, boolean redirige, String redireccion) {
		respuesta.addObject(tipoMensaje.toString(), mensaje);
		respuesta.addObject("redirige", Boolean.toString(redirige));
		if(redirige) {
			respuesta.addObject("redireccion", redireccion);
		}
	}

	/*
	 *  GETTERS
	 */
	public MessageSource fuenteMensajes() {
		return fuenteMensajes;
	}
	
}
